package com.zxh.servlet;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet("/code.do")
public class ValidateCodeServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doPost(req, resp);
		}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
			resp.setContentType("image/jpeg");//指定类型
			ServletOutputStream out = resp.getOutputStream();//获取一个二进制输出流对象
			int width = 60;
			int height =20;
			//创建缓冲图像
			BufferedImage imgbuf = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
			Graphics2D g = imgbuf.createGraphics();//创建一只画笔
			g.fillRect(0, 0, width, height);//设置图像的形状及高度
			g.setColor(getRandColor(200, 250));//设置背景颜色
			g.setFont(new Font("Times News Roman",Font.PLAIN,18));//设置字体
			//随机产生数
			String code="";
			Random r = new Random();//随机数
			String codes="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
			int index=codes.length();
			for(int i=0;i<4;i++){
				String rand=String.valueOf(codes.charAt(r.nextInt(index)));
				code+=rand;
				g.setColor(new Color(20+r.nextInt(110),20+r.nextInt(110),20+r.nextInt(110)));
				g.drawString(rand, 13*i+6,16);//画字符串
			}
			
			System.out.println("生成的随机数"+code);
			//传递随机数的值
			HttpSession session =req.getSession();
			session.setAttribute("code",code);
			
			ImageIO.write(imgbuf,"JPEG", out);
			out.close();
			//干扰线
			g.setColor(getRandColor(160, 200));
			for(int i=0;i<100;i++){
				int x=r.nextInt(width);
				int y=r.nextInt(height);
				int x1=r.nextInt(12);
				int y1=r.nextInt(12);
				g.drawOval(x,y,x+x1,y+y1);
			}
			//干扰点
			g.setColor(getRandColor(120, 240));
			for(int i=0;i<100;i++){
				int x=r.nextInt(width);
				int y=r.nextInt(height);
				g.drawOval(x,y,0,0);
			}
	}
	/**
	 * 获取指定范围的随机颜色
	 * @param fc
	 * @param bc
	 * @return
	 */
	private Color getRandColor(int fc,int bc){
		Random random = new Random();
		if(fc>255){
			fc=255;
		}
		if(fc<0){
			fc=0;
		}
		if(bc>255){
			bc=255;
		}
		if(bc<0){
			bc=0;
		}
		int r = fc +random.nextInt(bc-fc);
		int g = fc +random.nextInt(bc-fc);
		int b = fc +random.nextInt(bc-fc);
		return new Color(r,g,b);
	}

}
